self理解 & 子类调用父类函数的方法

您所在的位置:网站首页 python 函数类的子类 self理解 & 子类调用父类函数的方法

self理解 & 子类调用父类函数的方法

2024-04-04 12:27| 来源: 网络整理| 查看: 265

1、self的含义

类是抽象的模板,实例是根据类创建出的一个个具体对象。

下面代码中,andy_1.run() 会被python解释器转化为 Dog.run(andy_1),可以看到对象 andy_1 被传给了参数 self,用于表明是Dog类的哪个对象在调用run方法。

这种指明是Dog类的哪个对象在调用run方法,被称为将run方法绑定到andy_1 对象。

这就是为什么类中定义的函数(包括__init__),都要用self作为第一个参数,就是用来接受具体的对象。特别说明的是,不一定非要用self做参数名,用a b c等任意变量名均可,self只是约定俗成的习惯。

即便是被系统自动调用的函数,如__init__,系统也会将要初始化的对象传递给__init__方法的 self 参数。(__init__并不是c++中的构造方法,d=Dog(‘andy’) 实际会等价于 d=object.__new__(Dog),Dog.__init__(d, ‘andy’) 两条语句,即调用init前,对象已经被创建完成。)

class Dog(object): def __init__(self, name): self.name = name def run(self): print self.name, 'is running' andy_1 = Dog('andy_1') andy_1.run() andy_2 = Dog('andy_2') andy_2.run() 2、子类调用父类的函数

子类调用父类有两种方式:通过父类名 或 通过super函数。 我们用最常见的是调用父类的 __init__()方法说明。 (1)使用父类名 实际上使用了python解释器的方式调用类的函数,即将父类的 init 函数绑定到b1上。注意 A.__init__(self) 这行代码中,self参数实际已经被赋值为 b1 对象。

class A(object): def __init__(self): print 'in A init' class B(A): def __init__(self): A.__init__(self) b1 = B()

这种方式有一个缺点,当子类的父类变化为其他类时,所有显示使用父类名的地方都要被修改为新的父类名。因此,推荐使用super 函数的方式调用父类函数。

(2)使用super函数:super(type, [type-or-object]) super函数返回的不一定是父类,实际是MRO表中下一个类。: super做的是下面这件事

def super(cls, inst): mro_list = inst.__class__.mro() return mro_list[mro_list.index(cls) + 1]

两个参数 cls 和 inst 分别做了两件事: 1. inst 负责生成 MRO 的 list 2. 通过 cls 定位当前 MRO 中的 index,并返回 mro[index + 1]

举例:

class A(object): def __init__(self): print 'in A init' class B(A): def __init__(self): super(B, self).__init__() b = B()


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3